<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 递归： 自己调用自己  有递 有归
        function fn(num) {
            if (num === 1) {
                return 1
            }
            return num + fn(num - 1)
        }

        fn(3)  // ==>  3 + fn(2)  ==>  3 + 2 + fn(1) ==> 3 + 2 + 1  ==> 6
        console.log(fn(3))  // 6

        fn(5)  // ==>  5 + fn(4) ==>  5 + 4 + fn(3) ==> 5 + 4 + 3 + fn(2) ==> 5 + 4 + 3 + 2 + fn(1) 
        //   5 + 4 + 3 + 2 + 1  ==> 15 
        console.log(fn(5))

        // 递归的问题
        // ===> 递归爆栈 (栈溢出)
        // 栈 ===> 数据结构，有先进后出的特征，栈有深度，如果超出了，就会造出栈溢出报错
        // Maximun call stack size exceeded
        // let res = fn(10000000)
        // console.log(res)

        // 递归也可以看作一种循环(不断的调用自己)，循环有终止条件，当然递归也需要有终止条件
        // 递归的终止条件，一般写在第二次调用的前面，return可以终止函数的执行

        let i = 1
        function count() {
            i++
            console.log(`这是第${i}次调用`)
            if (i >= 100) {
                return
            }
            count()
        }
        count()
    </script>
</body>

</html>